/*
 * Elements.h
 *
 *  Created on: 2010-10-26
 *      Author: wenjian
 */

#ifndef ELEMENTS_H_
#define ELEMENTS_H_
#include "../commons.h"
#include "../draw/AbstractElements.h"
//#include "../draw/AbstractElement.h"
#include "Element.h"

namespace Ed {

  class Elements: public Ed::AbstractElements, public Ed::Element {
    public:
      Elements();
      Elements(AbstractElement* e);
      Elements(const std::vector<AbstractElement*>* es);
      Elements(const std::vector<Element*>* es);
      virtual ~Elements();

      /**
       * 返回所有元素
       */
      virtual inline const std::vector<Element*>* getElements() const{
        return (const std::vector<Element*>*)&elements;
      }

      /**
       * 画此元素
       */
      virtual void draw(Gdiplus::Graphics* g);

      /**
       * 跟踪响应事件
       */
      virtual bool trackEvent(const Thk::Event* e){
        return AbstractElements::trackEvent(e);
      };

      /**
       * 重画与此元素相交的其它元素, 排除<code>excludeds</code>中的元素
       */
      virtual void redrawIntersection(const std::vector<AbstractElement*>* excludeds=NULL){
        AbstractElements::redrawIntersection(excludeds);
      }


      /**
       * 检查是否被修改
       */
      virtual bool isModified(){
        return AbstractElements::isModified();
      }


      /**
       * 返回所在的层
       */
      virtual AbstractLayer* getLayer(){
        return Element::getLayer();
      }

      /**
       * 设置图层
       */
      virtual void setLayer(AbstractLayer* l){
        Element::setLayer(l);
      }

      /**
       * 检查是否允许响应事件
       */
      //virtual bool isEventEnabled()=0;
      virtual bool isEventEnabled(){
        return Element::isEventEnabled();
      }

      /**
       * 创建矩形区域
       */
      virtual void createBoundRect();


      /**
       * 重画与此元素相交的元素, 包括相交元素和自己, 排除<code>excludeds</code>中的元素
       */
      virtual void redrawAll(const std::vector<AbstractElement*>* excludeds=NULL);

      /**
       * 增量移动到目标位置
       */
      virtual void moveBy(real dx, real dy);

    protected:

    protected:
      /**
       * 处理鼠标事件
       */
      virtual bool handleMouseEvent(const MouseEvent* me){
        return Elements::handleMouseEvent(me);
      }

      /**
       * 发送鼠标离开事件
       */
      virtual bool mouseLeave(){
        //如果鼠标最近一次悬停的元素存在，调用离开元素方法
        if(mouseHoveringElement && mouseHoveringElement->mouseIsHovering() ){
          //mouseHoveringElement->mouseLeave();
          mouseLeaveElement(mouseHoveringElement);
        }
        return Element::mouseLeave();
      }

    private:
      typedef vector<Element*>::iterator Iterator;
      typedef vector<Element*>::const_iterator ConstIterator;
  };

}

#endif /* ELEMENTS_H_ */
